package main

import (
	"crypto/tls"
	"fmt"
	"net/smtp"
	"os"
	"path/filepath"
	"strings"
	"time"
)

const (
	maxLogSize    = 10 * 1024 * 1024 // 10MB
	maxLogBackups = 5
)

func getLogFile() (*os.File, error) {
	// 确保日志目录存在
	logDir := "logs"
	if err := os.MkdirAll(logDir, 0755); err != nil {
		return nil, fmt.Errorf("创建日志目录失败: %v", err)
	}

	logPath := filepath.Join(logDir, "reminder.log")

	// 检查日志文件大小
	if info, err := os.Stat(logPath); err == nil {
		if info.Size() >= maxLogSize {
			// 轮转日志文件
			for i := maxLogBackups - 1; i > 0; i-- {
				oldPath := fmt.Sprintf("%s.%d", logPath, i)
				newPath := fmt.Sprintf("%s.%d", logPath, i+1)
				if _, err := os.Stat(oldPath); err == nil {
					os.Rename(oldPath, newPath)
				}
			}
			os.Rename(logPath, logPath+".1")
		}
	}

	// 打开日志文件
	return os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
}

func logEmail(message string) {
	file, err := getLogFile()
	if err != nil {
		fmt.Printf("无法打开日志文件: %v\n", err)
		return
	}
	defer file.Close()

	// 获取当前时间
	currentTime := time.Now().Format("2006-01-02 15:04:05")

	// 写入日志
	logMessage := fmt.Sprintf("[%s] %s\n", currentTime, message)
	if _, err := file.WriteString(logMessage); err != nil {
		fmt.Printf("写入日志失败: %v\n", err)
	}
}

func SendEmail(config *EmailConfig, subject string, body string) error {
	auth := smtp.PlainAuth("", config.Username, config.Password, config.SMTPServer)

	msg := fmt.Sprintf("From: %s\r\n"+
		"To: %s\r\n"+
		"Subject: %s\r\n"+
		"\r\n"+
		"%s\r\n",
		config.From,
		strings.Join(config.To, ","),
		subject,
		body)

	// 创建TLS配置
	tlsConfig := &tls.Config{
		InsecureSkipVerify: true,
		ServerName:         config.SMTPServer,
	}

	// 建立TLS连接
	conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", config.SMTPServer, config.SMTPPort), tlsConfig)
	if err != nil {
		logEmail(fmt.Sprintf("邮件发送失败 - 连接错误: %v", err))
		return err
	}
	defer conn.Close()

	client, err := smtp.NewClient(conn, config.SMTPServer)
	if err != nil {
		logEmail(fmt.Sprintf("邮件发送失败 - 创建客户端错误: %v", err))
		return err
	}
	defer client.Close()

	// 认证
	if err = client.Auth(auth); err != nil {
		logEmail(fmt.Sprintf("邮件发送失败 - 认证错误: %v", err))
		return err
	}

	// 设置发件人
	if err = client.Mail(config.From); err != nil {
		logEmail(fmt.Sprintf("邮件发送失败 - 设置发件人错误: %v", err))
		return err
	}

	// 设置收件人
	for _, to := range config.To {
		if err = client.Rcpt(to); err != nil {
			logEmail(fmt.Sprintf("邮件发送失败 - 设置收件人错误: %v", err))
			return err
		}
	}

	// 发送邮件内容
	w, err := client.Data()
	if err != nil {
		logEmail(fmt.Sprintf("邮件发送失败 - 准备发送数据错误: %v", err))
		return err
	}
	defer w.Close()

	_, err = w.Write([]byte(msg))
	if err != nil {
		logEmail(fmt.Sprintf("邮件发送失败 - 写入数据错误: %v", err))
		return err
	}

	// 记录成功的邮件发送
	logEmail(fmt.Sprintf("邮件发送成功 - 主题: %s, 收件人: %s", subject, strings.Join(config.To, ",")))
	return nil
}
